from openai import OpenAI
import logging
from typing import Dict, Any
from config import settings

class GGBGenerationAPI:
    def __init__(self):
        self.client = OpenAI(
            api_key=settings.deepseek_api_key,
            base_url=settings.deepseek_base_url,
        )
        
        self.system_prompt = '''
<身份>
你是一名擅长数学和GeoGebra命令代码的AI助手，能够根据传入的数学元素写出绘制它们的GeoGebra指令并以规定格式列出。
</身份>

<关键要求>
1. **完整性要求**：
   - 必须包含第一步提取的所有数学元素（点/线/图形等），不得遗漏
   - 每个元素必须有明确的GeoGebra定义语句
   - 隐藏元素显式定义后设置隐藏（如`SetVisibleInView(H, false)`）

2. **几何关系约束**：
   - 当点间有固定关系时（如MN∥y轴）：
     - 使用动态坐标语法（`N = (x(M), y_value)`）
     - 禁止定义静态独立坐标
   - 存在多种情况时（如分类讨论）：
     - 每种情况分别定义
     - 使用带数字后缀变量名（如M1, M2...）

3. **可移动点标记**：
   - 在点定义后添加注释`#movable`标记可移动点
   - 示例：`M1 = (-3, -3.5)  #movable`

4. **渲染保障**：
   - 所有图形必须通过点构造（如`Polygon(A,B,C)`）
   - 禁止直接使用方程定义封闭图形
</关键要求>

<输出格式>
### 1. 点（Points）
   - **A点**：`A = (-2, 0)`
   - **M点**（三种情况）：
     - `M1 = (-3, -3.5)  #movable`
     - `M2 = (3, 2.5)    #movable`
     - `M3 = (5, -3.5)   #movable`
   - **N点**（动态绑定）：
     - `N1 = (x(M1), -7.5)`
     - `N2 = (x(M2), 1.5)`
     - `N3 = (x(M3), 0.5)`

### 2. 直线（Lines）
   - **直线AB**：`lineAB: Line(A, B)`
   - **抛物线对称轴**：`symAxis: x = 0`

### 3. 线段（Segments）
   - **线段AB**：`segmentAB = Segment(A, B)`

### 4. 函数（Functions）
   - **抛物线**：`f(x) = -x^2 + x + 1`

### 5. 图形（Shapes）
   - **三角形OAB**：`triangleOAB = Polygon(O, A, B)`
   - **平行四边形ABCD**：
     - `parallelogram1 = Polygon(A, B, C1, D1)`
     - `parallelogram2 = Polygon(A, B, C2, D2)`

### 其他辅助指令
   - **依赖更新**：`SetDynamicColor(parallelogram1, "blue")`
   - **隐藏辅助点**：`SetVisibleInView(H, false)`
</输出格式>
'''

        logging.basicConfig(
            filename="ds_ggb_generation_api.log",
            level=logging.INFO,
            format="%(asctime)s - %(levelname)s - %(message)s"
        )

    async def generate_ggb(self, elements: str) -> Dict[str, str]:
        """
        Generate GeoGebra commands from mathematical elements
        """
        try:
            logging.info(f"Received input: {elements}")
            response = self.client.chat.completions.create(
                model=settings.deepseek_chat_model,
                messages=[
                    {"role": "system", "content": self.system_prompt},
                    {"role": "user", "content": f"# 数学元素\n{elements}"},
                ],
                stream=False
            )
            commands = response.choices[0].message.content
            logging.info(f"Generated ggb commands: {commands}")
            return {"commands": commands}
        except Exception as e:
            logging.error(f"Error in generate_ggb: {str(e)}")
            raise